<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>构造函数存在浪费内存的问题 </title>
</head>

<body>
    <script>
        function Star(uname, age) {
            this.uname = uname
            this.age = age

            // this.sing = function () {
            //     console.log('唱歌');

            // }
        }
        // 公共的方法放到构造函数的原型对象里 这样实例对象在使用时就不必在单独开辟内存空间了
        Star.prototype.sing = function () {
            console.log('唱歌');
        }
        var ldh = new Star('刘德华', 18)
        var zxy = new Star('张学友', 20)
        // 个人解析：
        // 两个相同类的 实例化对象 
        // 会在内存里开辟不同的空间存放相同的函数(不同的空间代表不同的地址) 那么就会造成浪费内存和浪费加载时间
        console.log(ldh.sing === zxy.sing);//false比较的是sing函数的地址
        ldh.sing()
        zxy.sing()
        // 那么 我们希望所有的对象使用同一个函数,这样就比较节省内存,那么我们要怎样做呢？
        // console.dir(Star);
        // 老师总结：
        // 在我们es6之前 我们面向对象是通过构造函数来实现的 但是构造函数里面有一个缺点
        // 我们以前是把我们的方法放到构造函数里面 这样呢 就会有一个问题 在我们创建实例的时候 都会为我们这个方法单独在开辟一个内存空间 存放同一个函数 这样呢 就比较浪费内存
        // 解决方案:我们把公共的方法定义到构造函数的原型对象身上 这样就可以实现方法的共享 所有的实例都可以使用这个方法
        // 原型什么？
        // 原型是一个对象 每一构造函数系统都定义好了这个对象
        // 原型对象的主要作用是什么?
        // 实现了方法的共享 不必再开辟内存空间 所有的实例都可以使用这个方法 这就是原型最伟大的地方。

    </script>
</body>

</html>